home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / patches / dungeon.lha / Dungeon / Source.lha / dsub.c < prev    next >
C/C++ Source or Header  |  1995-10-15  |  12KB  |  633 lines

  1. /* RESIDENT SUBROUTINES FOR DUNGEON */
  2.  
  3. /*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
  4. /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
  5. /* WRITTEN BY R. M. SUPNIK */
  6.  
  7. #include <stdio.h>
  8. #include "funcs.h"
  9. #include "vars.h"
  10.  
  11. #ifndef SEEK_SET
  12. #define SEEK_SET (0)
  13. #endif
  14.  
  15. extern FILE *dbfile;
  16.  
  17. static void rspsb2nl_ P((integer, integer, integer, logical));
  18.  
  19. /* RSPEAK-- OUTPUT RANDOM MESSAGE ROUTINE */
  20.  
  21. /* CALLED BY-- */
  22.  
  23. /*     CALL RSPEAK(MSGNUM) */
  24.  
  25. void rspeak_(n)
  26. integer n;
  27. {
  28.     rspsb2nl_(n, 0, 0, 1);
  29. } /* rspeak_ */
  30.  
  31. /* RSPSUB-- OUTPUT RANDOM MESSAGE WITH SUBSTITUTABLE ARGUMENT */
  32.  
  33. /* CALLED BY-- */
  34.  
  35. /*     CALL RSPSUB(MSGNUM,SUBNUM) */
  36.  
  37. void rspsub_(n, s1)
  38. integer n;
  39. integer s1;
  40. {
  41.     rspsb2nl_(n, s1, 0, 1);
  42. } /* rspsub_ */
  43.  
  44. /* RSPSB2-- OUTPUT RANDOM MESSAGE WITH UP TO TWO SUBSTITUTABLE ARGUMENTS */
  45.  
  46. /* CALLED BY-- */
  47.  
  48. /*     CALL RSPSB2(MSGNUM,SUBNUM1,SUBNUM2) */
  49.  
  50. void rspsb2_(n, s1, s2)
  51. integer n;
  52. integer s1;
  53. integer s2;
  54. {
  55.     rspsb2nl_(n, s1, s2, 1);
  56. } /* rspsb2_ */
  57.  
  58. /* rspsb2nl_ Display a substitutable message with an optional newline */
  59.  
  60. static void rspsb2nl_(n, y, z, nl)
  61. integer n;
  62. integer y;
  63. integer z;
  64. logical nl;
  65. {
  66.     const char *zkey = "IanLanceTaylorJr";
  67.     long x;
  68.  
  69.     x = (long)n;
  70.  
  71.     if (x > 0) {
  72.     x = rmsg_1.rtext[x - 1];
  73.     }
  74. /*                         !IF >0, LOOK UP IN RTEXT. */
  75.     if (x == 0) {
  76.     return;
  77.     }
  78. /*                         !ANYTHING TO DO? */
  79.     play_1.telflg = TRUE_;
  80. /*                         !SAID SOMETHING. */
  81.  
  82.     x = ((- x) - 1) * 8;
  83.     if (fseek(dbfile, x + (long)rmsg_1.mrloc, SEEK_SET) == EOF) {
  84.     fprintf(stderr, "Error seeking database loc %d\n", x);
  85.     exit_();
  86.     }
  87.  
  88.     if (nl)
  89.     more_output(NULL);
  90.  
  91.     while (1) {
  92.     integer i;
  93.  
  94.     i = getc(dbfile);
  95.     if (i == EOF) {
  96.         fprintf(stderr, "Error reading database loc %d\n", x);
  97.         exit_();
  98.     }
  99.     i ^= zkey[x & 0xf] ^ (x & 0xff);
  100.     x = x + 1;
  101.     if (i == '\0') {
  102.         if (nl)
  103.         putchar('\n');
  104.         return;
  105.     }
  106.     else if (i == '\n') {
  107.         putchar('\n');
  108.         if (nl)
  109.         more_output(NULL);
  110.     }
  111.     else if (i == '#' && y != 0) {
  112.         long iloc;
  113.  
  114.         iloc = ftell(dbfile);
  115.         rspsb2nl_(y, 0, 0, 0);
  116.         if (fseek(dbfile, iloc, SEEK_SET) == EOF) {
  117.         fprintf(stderr, "Error seeking database loc %d\n", iloc);
  118.         exit_();
  119.         }
  120.         y = z;
  121.         z = 0;
  122.     }
  123.     else putchar(i);
  124.     }
  125. }
  126.  
  127. /* OBJACT-- APPLY OBJECTS FROM PARSE VECTOR */
  128.  
  129. /* DECLARATIONS */
  130.  
  131. logical objact_()
  132. {
  133.     /* System generated locals */
  134.     logical ret_val;
  135.  
  136.     ret_val = TRUE_;
  137. /*                         !ASSUME WINS. */
  138.     if (prsvec_1.prsi == 0) {
  139.     goto L100;
  140.     }
  141. /*                         !IND OBJECT? */
  142.     if (oappli_(objcts_1.oactio[prsvec_1.prsi - 1], 0)) {
  143.     return ret_val;
  144.     }
  145. /*                         !YES, LET IT HANDLE. */
  146.  
  147. L100:
  148.     if (prsvec_1.prso == 0) {
  149.     goto L200;
  150.     }
  151. /*                         !DIR OBJECT? */
  152.     if (oappli_(objcts_1.oactio[prsvec_1.prso - 1], 0)) {
  153.     return ret_val;
  154.     }
  155. /*                         !YES, LET IT HANDLE. */
  156.  
  157. L200:
  158.     ret_val = FALSE_;
  159. /*                         !LOSES. */
  160.     return ret_val;
  161. } /* objact_ */
  162.  
  163. /* BUG-- REPORT FATAL SYSTEM ERROR */
  164.  
  165. /* CALLED BY-- */
  166.  
  167. /*     CALL BUG(NO,PAR) */
  168.  
  169. void bug_(a, b)
  170. integer a;
  171. integer b;
  172. {
  173.     /* Local variables */
  174.  
  175.     more_output(NULL);
  176.     printf("PROGRAM ERROR %d, PARAMETER=%d\n", a, b);
  177.  
  178.     if (debug_1.dbgflg != 0) {
  179.     return;
  180.     }
  181.     exit_();
  182.  
  183. } /* bug_ */
  184.  
  185. /* NEWSTA-- SET NEW STATUS FOR OBJECT */
  186.  
  187. /* CALLED BY-- */
  188.  
  189. /*     CALL NEWSTA(OBJECT,STRING,NEWROOM,NEWCON,NEWADV) */
  190.  
  191. void newsta_(o, r, rm, cn, ad)
  192. integer o;
  193. integer r;
  194. integer rm;
  195. integer cn;
  196. integer ad;
  197. {
  198.     rspeak_(r);
  199.     objcts_1.oroom[o - 1] = rm;
  200.     objcts_1.ocan[o - 1] = cn;
  201.     objcts_1.oadv[o - 1] = ad;
  202. } /* newsta_ */
  203.  
  204. /* QHERE-- TEST FOR OBJECT IN ROOM */
  205.  
  206. /* DECLARATIONS */
  207.  
  208. logical qhere_(obj, rm)
  209. integer obj;
  210. integer rm;
  211. {
  212.     /* System generated locals */
  213.     integer i__1;
  214.     logical ret_val;
  215.  
  216.     /* Local variables */
  217.     integer i;
  218.  
  219.     ret_val = TRUE_;
  220.     if (objcts_1.oroom[obj - 1] == rm) {
  221.     return ret_val;
  222.     }
  223. /*                         !IN ROOM? */
  224.     i__1 = oroom2_1.r2lnt;
  225.     for (i = 1; i <= i__1; ++i) {
  226. /*                         !NO, SCH ROOM2. */
  227.     if (oroom2_1.oroom2[i - 1] == obj && oroom2_1.rroom2[i - 1] == rm) {
  228.  
  229.         return ret_val;
  230.     }
  231. /* L100: */
  232.     }
  233.     ret_val = FALSE_;
  234. /*                         !NOT PRESENT. */
  235.     return ret_val;
  236. } /* qhere_ */
  237.  
  238. /* QEMPTY-- TEST FOR OBJECT EMPTY */
  239.  
  240. /* DECLARATIONS */
  241.  
  242. logical qempty_(obj)
  243. integer obj;
  244. {
  245.     /* System generated locals */
  246.     integer i__1;
  247.     logical ret_val;
  248.  
  249.     /* Local variables */
  250.     integer i;
  251.  
  252.     ret_val = FALSE_;
  253. /*                         !ASSUME LOSE. */
  254.     i__1 = objcts_1.olnt;
  255.     for (i = 1; i <= i__1; ++i) {
  256.     if (objcts_1.ocan[i - 1] == obj) {
  257.         return ret_val;
  258.     }
  259. /*                         !INSIDE TARGET? */
  260. /* L100: */
  261.     }
  262.     ret_val = TRUE_;
  263.     return ret_val;
  264. } /* qempty_ */
  265.  
  266. /* JIGSUP- YOU ARE DEAD */
  267.  
  268. /* DECLARATIONS */
  269.  
  270. void jigsup_(desc)
  271. integer desc;
  272. {
  273.     /* Initialized data */
  274.  
  275.     static const integer rlist[9] = { 8,6,36,35,34,4,34,6,5 };
  276.  
  277.     /* System generated locals */
  278.     integer i__1;
  279.  
  280.     /* Local variables */
  281.     integer nonofl;
  282.     logical f;
  283.     integer i, j;
  284.  
  285.     rspeak_(desc);
  286. /*                         !DESCRIBE SAD STATE. */
  287.     prsvec_1.prscon = 1;
  288. /*                         !STOP PARSER. */
  289.     if (debug_1.dbgflg != 0) {
  290.     return;
  291.     }
  292. /*                         !IF DBG, EXIT. */
  293.     advs_1.avehic[play_1.winner - 1] = 0;
  294. /*                         !GET RID OF VEHICLE. */
  295.     if (play_1.winner == aindex_1.player) {
  296.     goto L100;
  297.     }
  298. /*                         !HIMSELF? */
  299.     rspsub_(432, objcts_1.odesc2[advs_1.aobj[play_1.winner - 1] - 1]);
  300. /*                         !NO, SAY WHO DIED. */
  301.     newsta_(advs_1.aobj[play_1.winner - 1], 0, 0, 0, 0);
  302. /*                         !SEND TO HYPER SPACE. */
  303.     return;
  304.  
  305. L100:
  306.     if (findex_1.endgmf) {
  307.     goto L900;
  308.     }
  309. /*                         !NO RECOVERY IN END GAME. */
  310.     if (state_1.deaths >= 2) {
  311.     goto L1000;
  312.     }
  313. /*                         !DEAD TWICE? KICK HIM OFF. */
  314.     if (! yesno_(10, 9, 8)) {
  315.     goto L1100;
  316.     }
  317. /*                         !CONTINUE? */
  318.  
  319.     i__1 = objcts_1.olnt;
  320.     for (j = 1; j <= i__1; ++j) {
  321. /*                         !TURN OFF FIGHTING. */
  322.     if (qhere_(j, play_1.here)) {
  323.         objcts_1.oflag2[j - 1] &= ~ FITEBT;
  324.     }
  325. /* L50: */
  326.     }
  327.  
  328.     ++state_1.deaths;
  329.     scrupd_(- 10);
  330. /*                         !CHARGE TEN POINTS. */
  331.     f = moveto_(rindex_1.fore1, play_1.winner);
  332. /*                         !REPOSITION HIM. */
  333.     findex_1.egyptf = TRUE_;
  334. /*                         !RESTORE COFFIN. */
  335.     if (objcts_1.oadv[oindex_1.coffi - 1] == play_1.winner) {
  336.     newsta_(oindex_1.coffi, 0, rindex_1.egypt, 0, 0);
  337.     }
  338.     objcts_1.oflag2[oindex_1.door - 1] &= ~ TCHBT;
  339.     objcts_1.oflag1[oindex_1.robot - 1] = (objcts_1.oflag1[oindex_1.robot - 1]
  340.          | VISIBT) & ~ NDSCBT;
  341.     if (objcts_1.oroom[oindex_1.lamp - 1] != 0 || objcts_1.oadv[oindex_1.lamp 
  342.         - 1] == play_1.winner) {
  343.     newsta_(oindex_1.lamp, 0, rindex_1.lroom, 0, 0);
  344.     }
  345.  
  346. /* NOW REDISTRIBUTE HIS VALUABLES AND OTHER BELONGINGS. */
  347.  
  348. /* THE LAMP HAS BEEN PLACED IN THE LIVING ROOM. */
  349. /* THE FIRST 8 NON-VALUABLES ARE PLACED IN LOCATIONS AROUND THE HOUSE. */
  350. /* HIS VALUABLES ARE PLACED AT THE END OF THE MAZE. */
  351. /* REMAINING NON-VALUABLES ARE PLACED AT THE END OF THE MAZE. */
  352.  
  353.     i = 1;
  354.     i__1 = objcts_1.olnt;
  355.     for (j = 1; j <= i__1; ++j) {
  356. /*                         !LOOP THRU OBJECTS. */
  357.     if (objcts_1.oadv[j - 1] != play_1.winner || objcts_1.otval[j - 1] != 
  358.         0) {
  359.         goto L200;
  360.     }
  361.     ++i;
  362.     if (i > 9) {
  363.         goto L400;
  364.     }
  365. /*                         !MOVE TO RANDOM LOCATIONS. */
  366.     newsta_(j, 0, rlist[i - 1], 0, 0);
  367. L200:
  368.     ;
  369.     }
  370.  
  371. L400:
  372.     i = rooms_1.rlnt + 1;
  373. /*                         !NOW MOVE VALUABLES. */
  374.     nonofl = RAIR + RWATER + RSACRD + REND;
  375. /*                         !DONT MOVE HERE. */
  376.     i__1 = objcts_1.olnt;
  377.     for (j = 1; j <= i__1; ++j) {
  378.     if (objcts_1.oadv[j - 1] != play_1.winner || objcts_1.otval[j - 1] == 
  379.         0) {
  380.         goto L300;
  381.     }
  382. L250:
  383.     --i;
  384. /*                         !FIND NEXT ROOM. */
  385.     if ((rooms_1.rflag[i - 1] & nonofl) != 0) {
  386.         goto L250;
  387.     }
  388.     newsta_(j, 0, i, 0, 0);
  389. /*                         !YES, MOVE. */
  390. L300:
  391.     ;
  392.     }
  393.  
  394.     i__1 = objcts_1.olnt;
  395.     for (j = 1; j <= i__1; ++j) {
  396. /*                         !NOW GET RID OF REMAINDER. */
  397.     if (objcts_1.oadv[j - 1] != play_1.winner) {
  398.         goto L500;
  399.     }
  400. L450:
  401.     --i;
  402. /*                         !FIND NEXT ROOM. */
  403.     if ((rooms_1.rflag[i - 1] & nonofl) != 0) {
  404.         goto L450;
  405.     }
  406.     newsta_(j, 0, i, 0, 0);
  407. L500:
  408.     ;
  409.     }
  410.     return;
  411.  
  412. /* CAN'T OR WON'T CONTINUE, CLEAN UP AND EXIT. */
  413.  
  414. L900:
  415.     rspeak_(625);
  416. /*                         !IN ENDGAME, LOSE. */
  417.     goto L1100;
  418.  
  419. L1000:
  420.     rspeak_(7);
  421. /*                         !INVOLUNTARY EXIT. */
  422. L1100:
  423.     score_(0);
  424. /*                         !TELL SCORE. */
  425.     fini_();
  426.  
  427. } /* jigsup_ */
  428.  
  429. fini_()
  430. {
  431.     (void) fclose(dbfile);
  432.     exit_();
  433. } /* fini_ */
  434.  
  435. /* OACTOR-    GET ACTOR ASSOCIATED WITH OBJECT */
  436.  
  437. /* DECLARATIONS */
  438.  
  439. integer oactor_(obj)
  440. integer obj;
  441. {
  442.     /* System generated locals */
  443.     integer ret_val = 1, i__1;
  444.  
  445.     /* Local variables */
  446.     integer i;
  447.  
  448.     i__1 = advs_1.alnt;
  449.     for (i = 1; i <= i__1; ++i) {
  450. /*                         !LOOP THRU ACTORS. */
  451.     ret_val = i;
  452. /*                         !ASSUME FOUND. */
  453.     if (advs_1.aobj[i - 1] == obj) {
  454.         return ret_val;
  455.     }
  456. /*                         !FOUND IT? */
  457. /* L100: */
  458.     }
  459.     bug_(40, obj);
  460. /*                         !NO, DIE. */
  461.     return ret_val;
  462. } /* oactor_ */
  463.  
  464. /* PROB-        COMPUTE PROBABILITY */
  465.  
  466. /* DECLARATIONS */
  467.  
  468. logical prob_(g, b)
  469. integer g;
  470. integer b;
  471. {
  472.     /* System generated locals */
  473.     logical ret_val;
  474.  
  475.     /* Local variables */
  476.     integer i;
  477.  
  478.     i = g;
  479. /*                         !ASSUME GOOD LUCK. */
  480.     if (findex_1.badlkf) {
  481.     i = b;
  482.     }
  483. /*                         !IF BAD, TOO BAD. */
  484.     ret_val = rnd_(100) < i;
  485. /*                         !COMPUTE. */
  486.     return ret_val;
  487. } /* prob_ */
  488.  
  489. /* RMDESC-- PRINT ROOM DESCRIPTION */
  490.  
  491. /* RMDESC PRINTS A DESCRIPTION OF THE CURRENT ROOM. */
  492. /* IT IS ALSO THE PROCESSOR FOR VERBS 'LOOK' AND 'EXAMINE'. */
  493.  
  494. logical rmdesc_(full)
  495. integer full;
  496. {
  497.     /* System generated locals */
  498.     logical ret_val, L__1;
  499.  
  500.     /* Local variables */
  501.     integer i, ra;
  502.  
  503. /* FULL=    0/1/2/3=    SHORT/OBJ/ROOM/FULL */
  504.  
  505.     ret_val = TRUE_;
  506. /*                         !ASSUME WINS. */
  507.     if (prsvec_1.prso < xsrch_1.xmin) {
  508.     goto L50;
  509.     }
  510. /*                         !IF DIRECTION, */
  511.     screen_1.fromdr = prsvec_1.prso;
  512. /*                         !SAVE AND */
  513.     prsvec_1.prso = 0;
  514. /*                         !CLEAR. */
  515. L50:
  516.     if (play_1.here == advs_1.aroom[aindex_1.player - 1]) {
  517.     goto L100;
  518.     }
  519. /*                         !PLAYER JUST MOVE? */
  520.     rspeak_(2);
  521. /*                         !NO, JUST SAY DONE. */
  522.     prsvec_1.prsa = vindex_1.walkiw;
  523. /*                         !SET UP WALK IN ACTION. */
  524.     return ret_val;
  525.  
  526. L100:
  527.     if (lit_(play_1.here)) {
  528.     goto L300;
  529.     }
  530. /*                         !LIT? */
  531.     rspeak_(430);
  532. /*                         !WARN OF GRUE. */
  533.     ret_val = FALSE_;
  534.     return ret_val;
  535.  
  536. L300:
  537.     ra = rooms_1.ractio[play_1.here - 1];
  538. /*                         !GET ROOM ACTION. */
  539.     if (full == 1) {
  540.     goto L600;
  541.     }
  542. /*                         !OBJ ONLY? */
  543.     i = rooms_1.rdesc2[play_1.here - 1];
  544. /*                         !ASSUME SHORT DESC. */
  545.     if (full == 0 && (findex_1.superf || (rooms_1.rflag[play_1.here - 1] & 
  546.         RSEEN) != 0 && findex_1.brieff)) {
  547.     goto L400;
  548.     }
  549.  
  550. /*  The next line means that when you request VERBOSE mode, you */
  551. /*  only get long room descriptions 20% of the time. I don't either */
  552. /*  like or understand this, so the mod. ensures VERBOSE works */
  553. /*  all the time.            jmh@ukc.ac.uk 22/10/87 */
  554.  
  555. /* &                .AND.(BRIEFF.OR.PROB(80,80)))))       GO TO 400 */
  556.     i = rooms_1.rdesc1[play_1.here - 1];
  557. /*                         !USE LONG. */
  558.     if (i != 0 || ra == 0) {
  559.     goto L400;
  560.     }
  561. /*                         !IF GOT DESC, SKIP. */
  562.     prsvec_1.prsa = vindex_1.lookw;
  563. /*                         !PRETEND LOOK AROUND. */
  564.     if (! rappli_(ra)) {
  565.     goto L100;
  566.     }
  567. /*                         !ROOM HANDLES, NEW DESC? */
  568.     prsvec_1.prsa = vindex_1.foow;
  569. /*                         !NOP PARSER. */
  570.     goto L500;
  571.  
  572. L400:
  573.     rspeak_(i);
  574. /*                         !OUTPUT DESCRIPTION. */
  575. L500:
  576.     if (advs_1.avehic[play_1.winner - 1] != 0) {
  577.     rspsub_(431, objcts_1.odesc2[advs_1.avehic[play_1.winner - 1] - 
  578.         1]);
  579.     }
  580.  
  581. L600:
  582.     if (full != 2) {
  583.     L__1 = full != 0;
  584.     princr_(L__1, play_1.here);
  585.     }
  586.     rooms_1.rflag[play_1.here - 1] |= RSEEN;
  587.     if (full != 0 || ra == 0) {
  588.     return ret_val;
  589.     }
  590. /*                         !ANYTHING MORE? */
  591.     prsvec_1.prsa = vindex_1.walkiw;
  592. /*                         !GIVE HIM A SURPISE. */
  593.     if (! rappli_(ra)) {
  594.     goto L100;
  595.     }
  596. /*                         !ROOM HANDLES, NEW DESC? */
  597.     prsvec_1.prsa = vindex_1.foow;
  598.     return ret_val;
  599.  
  600. } /* rmdesc_ */
  601.  
  602. /* RAPPLI-    ROUTING ROUTINE FOR ROOM APPLICABLES */
  603.  
  604. /* DECLARATIONS */
  605.  
  606. logical rappli_(ri)
  607. integer ri;
  608. {
  609.     /* Initialized data */
  610.  
  611.     const integer newrms = 38;
  612.  
  613.     /* System generated locals */
  614.     logical ret_val;
  615.  
  616.  
  617.     ret_val = TRUE_;
  618. /*                         !ASSUME WINS. */
  619.     if (ri == 0) {
  620.     return ret_val;
  621.     }
  622. /*                         !IF ZERO, WIN. */
  623.     if (ri < newrms) {
  624.     ret_val = rappl1_(ri);
  625.     }
  626. /*                         !IF OLD, PROCESSOR 1. */
  627.     if (ri >= newrms) {
  628.     ret_val = rappl2_(ri);
  629.     }
  630. /*                         !IF NEW, PROCESSOR 2. */
  631.     return ret_val;
  632. } /* rappli_ */
  633.